package VIEWS;

import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.UUID;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JToolBar;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;

import CONTROLLERS.UsersControllers;
import ModelEntityFW.UserEntitys;
import Ultils.Controls;

public class frmUsers extends JFrame {
    private final JPanel contentPane;
    private final JTable table;
    private JTable jTLoadDataU;
    private static Connection m_objConnection;
    private UsersControllers m_objUserController;
    private static UserEntitys m_objSecurityContext;
    private static frmUsers fuser;
    private DefaultTableModel objDTM;
    private UserEntitys m_objUserEntity;
    private static boolean bFlag = false;
    private final JLabel lblHinC;
    int iCount;

    /**
     * Launch the application.
     */
    /*
     * public static void main(String[] args) { EventQueue.invokeLater(new
     * Runnable() {
     * 
     * @Override public void run() { try { fuser = new frmUsers(m_objConnection,
     * m_objSecurityContext); fuser.setVisible(true); } catch (Exception e) {
     * e.printStackTrace(); } } }); }
     */

    /**
     * Create the frame.
     */
    public frmUsers(Connection objConnection, UserEntitys objSecurity) {

        // Khởi tạo đối tượng
        m_objConnection = objConnection;
        m_objSecurityContext = objSecurity;
        m_objUserEntity = new UserEntitys();
        objDTM = new DefaultTableModel();
        jTLoadDataU = new JTable();
        iCount = 0;

        setResizable(false);

        setTitle("--- QUẢN LÝ THÔNG TIN NGƯỜI DÙNG HỆ THỐNG ---");
        setIconImage(Toolkit.getDefaultToolkit().getImage(frmUsers.class.getResource("/images/contacts.png")));
        setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
        setBounds(100, 100, 1018, 504);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JToolBar toolBar = new JToolBar();
        toolBar.setBounds(0, 0, 1021, 48);
        contentPane.add(toolBar);

        JButton btnThem = new JButton("Thêm Thành Viên [+]");
        btnThem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                // Thêm thông tin người dùng
                UserEntitys objUserEn = new UserEntitys();
                UUID objGui = UUID.randomUUID();
                objUserEn.setUserId(objGui.toString());

                objUserEn.setbFlag(false);
                frmUserAdd fUserAdd = new frmUserAdd(m_objConnection, m_objSecurityContext);
                fUserAdd.setLocation(400, 200);
                fUserAdd.setVisible(true);
                dispose();
            }
        });
        btnThem.setFont(new Font("Cambria", Font.PLAIN, 14));
        btnThem.setIcon(new ImageIcon(frmUsers.class.getResource("/images/book_edit.png")));
        toolBar.add(btnThem);

        JButton btnCapNhat = new JButton("Cập Nhật [!]");
        btnCapNhat.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                // 1. Kiểm tra trạng thái Entity
                if (m_objUserEntity == null) {
                    m_objUserEntity = new UserEntitys();
                }
                // 2. Thiết lập thông tin cho Entity
                if (bFlag) {
                    m_objUserEntity.setbFlag(true);
                    m_objUserEntity.setUserId(String.valueOf(objDTM.getValueAt(jTLoadDataU.getSelectedRow(), 0)));
                    m_objUserEntity.setUserName(String.valueOf(objDTM.getValueAt(jTLoadDataU.getSelectedRow(), 1)));
                    m_objUserEntity.setPasswords(String.valueOf(objDTM.getValueAt(jTLoadDataU.getSelectedRow(), 2)));
                    m_objUserEntity.setFullName(String.valueOf(objDTM.getValueAt(jTLoadDataU.getSelectedRow(), 3)));
                    /*
                     * m_objUserEntity.setBirthday(String.valueOf(objDTM.getValueAt
                     * (jTLoadDataU.getSelectedRow(), 4)));
                     * m_objUserEntity.setMobile
                     * (String.valueOf(objDTM.getValueAt
                     * (jTLoadDataU.getSelectedRow(), 5)));
                     */
                    m_objUserEntity.setEmail(String.valueOf(objDTM.getValueAt(jTLoadDataU.getSelectedRow(), 4)));
                    // m_objUserEntity.setAddress(String.valueOf(objDTM.getValueAt(jTLoadDataU.getSelectedRow(),
                    // 5)));
                    /*
                     * String getSex =
                     * String.valueOf(objDTM.getValueAt(jTLoadDataU
                     * .getSelectedRow(), 6)); if (getSex.equals("Nam")) {
                     * m_objUserEntity.setSex(true); } else {
                     * m_objUserEntity.setSex(false); }
                     */
                    // String getIsAdmin =
                    // String.valueOf(objDTM.getValueAt(jTLoadDataU.getSelectedRow(),
                    // 9));

                    // 3. Kiểm tra trạng thái UserController
                    frmUserAdd fUserAdd = new frmUserAdd(m_objConnection, m_objSecurityContext);
                    fUserAdd.setLocation(400, 200);
                    fUserAdd.setVisible(true);

                    dispose();
                } else {
                    JOptionPane.showMessageDialog(getParent(), "Vui lòng chon tài khoản cần cập nhật!", "Thông báo",
                            JOptionPane.WARNING_MESSAGE);
                    // return;
                }
            }
        });
        btnCapNhat.setIcon(new ImageIcon(frmUsers.class.getResource("/IMAGES/editgv2.png")));
        btnCapNhat.setFont(new Font("Cambria", Font.PLAIN, 14));
        toolBar.add(btnCapNhat);

        JButton btnXoa = new JButton("Xóa [-]");
        btnXoa.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                int opt = JOptionPane.showConfirmDialog(getParent(), "Bạn có chắc chắn muốn xóa dữ liệu này?",
                        "Thông báo", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null);
                if (opt == 0) {
                    // Yes
                    String getId = String.valueOf(objDTM.getValueAt(jTLoadDataU.getSelectedRow(), 0));

                    boolean bResult = false;
                    try {
                        UserEntitys objEntity = new UserEntitys();
                        objEntity.setUserId(getId);
                        bResult = m_objUserController.ExecOfDeleteElement(objEntity);
                    } catch (Exception e) {
                        JOptionPane.showMessageDialog(getParent(), "Lỗi xóa thông tin người dùng!", "Thông báo",
                                JOptionPane.ERROR_MESSAGE);
                    }

                    if (bResult) {
                        JOptionPane.showMessageDialog(getParent(), "Xóa tài khoản thành công!", "Thông báo",
                                JOptionPane.ERROR_MESSAGE);

                        // Thực thi hiển thị dữ liệu
                        LoadData(true);
                    } else {
                        JOptionPane.showMessageDialog(getParent(), "Xóa tài khoản thành công!", "Thông báo",
                                JOptionPane.ERROR_MESSAGE);
                    }
                }
            }
        });
        btnXoa.setIcon(new ImageIcon(frmUsers.class.getResource("/IMAGES/deleteIcon.png")));
        btnXoa.setFont(new Font("Cambria", Font.PLAIN, 14));
        toolBar.add(btnXoa);

        JButton btnTimkiem = new JButton("Tìm Kiếm [=]");
        btnTimkiem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {

            }
        });
        btnTimkiem.setIcon(new ImageIcon(frmUsers.class.getResource("/IMAGES/search.png")));
        btnTimkiem.setFont(new Font("Cambria", Font.PLAIN, 14));
        toolBar.add(btnTimkiem);

        JButton btnLamTuoi = new JButton("Làm tươi [^]");
        btnLamTuoi.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                // Thực thi hiển thị dữ liệu
                LoadData(true);
            }
        });
        btnLamTuoi.setFont(new Font("Cambria", Font.PLAIN, 14));
        btnLamTuoi.setIcon(new ImageIcon(frmUsers.class.getResource("/images/renew.png")));
        toolBar.add(btnLamTuoi);

        JButton btnDong = new JButton("Đóng [x]");
        btnDong.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                dispose();
            }
        });

        JButton btnGhiXuongFiles = new JButton("Ghi xuống Files [*]");
        btnGhiXuongFiles.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                Object[] options = { "XML File", "JSON File", "Hủy bỏ" };
                int n = JOptionPane.showOptionDialog(getParent(), "Hãy chọn loại File bạn muốn ghi: ",
                        "Chọn thể lại File", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null,
                        options, options[1]);
                if (n == 0) {

                    JOptionPane.showMessageDialog(getParent(), "Ghi XML thành công!");
                } else if (n == 1) {
                    JOptionPane.showMessageDialog(getParent(), "Ghi JSon thành công!");
                }
            }
        });
        btnGhiXuongFiles.setIcon(new ImageIcon(frmUsers.class.getResource("/IMAGES/save.png")));
        btnGhiXuongFiles.setFont(new Font("Cambria", Font.PLAIN, 14));
        toolBar.add(btnGhiXuongFiles);
        btnDong.setIcon(new ImageIcon(frmUsers.class.getResource("/images/cancel.gif")));
        btnDong.setFont(new Font("Cambria", Font.PLAIN, 14));
        toolBar.add(btnDong);

        table = new JTable();
        table.setBounds(0, 39, 1, 1);
        contentPane.add(table);

        JToolBar toolBar_1 = new JToolBar();
        toolBar_1.setBounds(0, 435, 1021, 31);
        contentPane.add(toolBar_1);

        lblHinC = new JLabel("Hiện có 5 người dùng hệ thống!");
        lblHinC.setFont(new Font("Cambria", Font.PLAIN, 14));
        toolBar_1.add(lblHinC);

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBounds(10, 51, 999, 382);
        contentPane.add(scrollPane);

        jTLoadDataU = new JTable();
        jTLoadDataU.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {
                bFlag = true;
            }
        });
        jTLoadDataU.setFont(new Font("Cambria", Font.PLAIN, 13));
        jTLoadDataU.setFillsViewportHeight(true);
        jTLoadDataU.setColumnSelectionAllowed(true);
        jTLoadDataU.setCellSelectionEnabled(true);
        jTLoadDataU.setBorder(null);
        scrollPane.setViewportView(jTLoadDataU);

        // Hiển thị dữ liệu lên JTable
        LoadData(true);

    }

    // Hiển thị dữ liệu lên JTable
    public void LoadData(boolean typeData) {
        try {
            // 1. Kiểm tra trạng thái kết nối
            if (!m_objConnection.isClosed()) {
                ResultSet objRS = null;
                if (typeData) {
                    // 2. Thực thi nhận v�? tập bản ghi Users
                    if (m_objUserController == null) {
                        m_objUserController = new UsersControllers(m_objConnection, m_objSecurityContext);
                    }
                    try {
                        objRS = m_objUserController.ExecOfGetElements();
                    } catch (Exception e) {
                        JOptionPane.showMessageDialog(getParent(), "Err: " + e, "Thông báo", JOptionPane.ERROR_MESSAGE);
                    }
                }
                // 3. Khai báo khởi tạo đối tượng
                Controls objControls = new Controls();

                // 4. Thực thi phương thức getModels để nhận v�?
                // DefaulTableModels
                try {
                    objDTM = objControls.getModels(objRS);
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
                jTLoadDataU.setModel(objDTM);

                lblHinC.setText(String.format("Hiện có %s người dùng hệ thống!", iCount));
            } else {
                JOptionPane.showMessageDialog(getParent(), "Không kết nối được với CSDL!", "Thông báo",
                        JOptionPane.ERROR_MESSAGE);
            }
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(getParent(), "Có lỗi xảy ra. Chi tiết: " + ex.getMessage(), "Thông báo",
                    JOptionPane.ERROR_MESSAGE);
        }
    }
}